#ifndef __VIMOCK_VIMOCK__
#define __VIMOCK_VIMOCK__

#include "mock_manager.hpp"
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/stringize.hpp>

#define MOCK_CLASS_BEGIN() \
	class BOOST_PP_CAT(mock, MOCK_CLASS_BASE) : public MOCK_CLASS_BASE { \
	private: \
		const mock_manager & mm; \
	public: \
		BOOST_PP_CAT(mock, MOCK_CLASS_BASE)(const mock_manager & mm) : \
			mm(mm) { \
		}
#define MOCK_METHOD0(return_type, method_name) \
	virtual return_type method_name() { \
		object_vector arguments(new std::vector<object>()); \
		invocation inv(new _invocation(this, & BOOST_PP_CAT(mock, MOCK_CLASS_BASE) :: method_name, arguments)); \
		return mm.invoked< return_type >(inv); \
	}

#define MOCK_CLASS_END() };

#endif //__VIMOCK_VIMOCK__
